14. 误差分析(Error Analysis)与灾难性遗忘

很多人训练模型时习惯:

训练
→ 看分数
→ 继续训练

但优秀的大模型团队真正的工作流程是:

评估
→ 发现错误
→ 分析错误
→ 修复问题
→ 重新训练

实际上:

误差分析(Error Analysis)往往比训练本身更重要。

因为训练只能告诉你模型变好了还是变坏了,

而误差分析告诉你:

模型为什么出错。


为什么误差分析重要

假设:

数学正确率

80%

→

85%

虽然提高了。

但是:

到底是哪20%的题目错了?

你并不知道。

因此:

指标只能告诉你结果,误差分析才能告诉你原因。


误差分析流程

graph TD

A[模型评估]
--> B[收集失败样本]

B --> C[人工分析错误]

C --> D[错误聚类]

D --> E[发现共性问题]

E --> F[提出修复方案]

F --> G[重新训练]

G --> H[重新评估]

H --> A

这是一个持续迭代的闭环。


一个真实的误差分析例子

问题:

23 ÷ 13 等于多少?

模型回答:

步骤1...

步骤2...

2.47

步骤3...

最终答案:2.47

正确答案:

23 ÷ 13 ≈ 1.769

显然错误。


第一反应通常是错误的

很多人会立即得出结论:

模型不会除法

但事实上:

这可能完全不是数学能力的问题。


进一步测试

测试1:

23 ÷ 13 等于多少?

错误。


测试2:

23 ÷ 13

正确。


测试3:

计算 23 ÷ 13

正确。


测试4:

请问23÷13等于多少?

错误。


此时发现:

问题可能和除法本身无关。

而与:

自然语言表达

有关。


真正的问题

模型可能在:

等于多少?

这种表达方式下,

激活了错误的推理模式。

或者:

步骤推理
和
最终答案

发生了混淆。


为什么需要错误聚类

如果只有:

1个错误

无法发现规律。

但如果有:

10000个错误

就需要自动分析。


Error Clustering(错误聚类)

核心思想:

相似错误通常来源于相同原因。


例如:

错误样本:

23 ÷ 13 等于多少?
我有23个苹果分给5个人怎么分?
100除以17是多少?
10个橘子分给3个人怎么办?

这些错误可能属于:

数学推理错误

同一个簇(Cluster)。


错误聚类流程

graph TD

A[失败样本]

--> B[Embedding Model]

B --> C1[问题向量1]
B --> C2[问题向量2]
B --> C3[问题向量3]

C1 --> D[Similarity计算]
C2 --> D
C3 --> D

D --> E[K-Means聚类]

E --> F1[数学推理错误]

E --> F2[工具调用错误]

E --> F3[幻觉错误]

E --> F4[指令遵循错误]

Embedding 在误差分析中的作用

Embedding Model 会把文本变成向量:

Question

↓

Embedding

↓

1536维向量

例如:

23÷13等于多少

变成:

[0.1,0.4,0.7,...]

Similarity(相似度)

常见方法:

Cosine Similarity

计算:

两个向量夹角

结果:

接近1
→ 非常相似
接近0
→ 不相似

K-Means 聚类

工业界常用:

K-Means

步骤:

graph LR

A[错误样本]
--> B[Embedding]

B --> C[向量空间]

C --> D[K-Means]

D --> E[Cluster1]

D --> F[Cluster2]

D --> G[Cluster3]

sklearn 示例

from sklearn.cluster import KMeans

kmeans = KMeans(
    n_clusters=10,
    random_state=42
)

labels = kmeans.fit_predict(
    embeddings
)

输出:

Cluster 0
数学错误

Cluster 1
工具调用错误

Cluster 2
代码错误

使用 LLM 做错误分类

现代团队越来越多使用:

LLM as Judge

让另一个模型帮助分析错误。


Prompt示例

请分析下面错误属于哪一类:

问题:
...

模型回答:
...

分类:
1. Factuality
2. Hallucination
3. Reasoning
4. Instruction Following
5. Tool Use Error
6. Under Refusal

常见错误分类

类型 说明
Factuality 事实错误
Hallucination 幻觉
Reasoning 推理错误
Instruction Following 指令未遵循
Tool Use Error 工具调用错误
Formatting Error 格式错误
Under Refusal 应拒绝但未拒绝
Over Refusal 过度拒绝

从错误到修复

发现错误后:

需要提出假设。

例如:

数学错误很多

假设:

缺少长链推理数据

修复:

增加CoT数据

增加数学RL

增加Verifier

然后再次训练。


Error Analysis 实际闭环

graph TD

A[发现错误]

--> B[聚类分析]

B --> C[提出假设]

C --> D[设计修复方案]

D --> E[训练模型]

E --> F[重新评估]

F --> G[验证假设]

G --> A

灾难性遗忘(Catastrophic Forgetting)

微调中另一个常见问题:

Catastrophic Forgetting


什么是灾难性遗忘

例如:

原模型:

会数学
会代码
会写作
会翻译

只用代码数据微调:

代码能力 ↑

但:

翻译能力 ↓

数学能力 ↓

模型忘记了原来的知识。

这就是:

灾难性遗忘。


为什么会发生

因为微调阶段:

梯度持续朝同一个方向更新

导致:

旧知识被覆盖

灾难遗忘示意图

graph LR

A[预训练知识]

--> B[代码微调]

B --> C[代码能力提升]

B --> D[部分能力下降]

如何缓解灾难遗忘

方法1:混入预训练数据

最经典的方法:

训练时加入少量通用数据。

例如:

99%

代码数据
1%

通用预训练数据

很多论文发现:

1%~5%

往往已经有效。


方法2:多任务训练

同时训练:

数学

代码

对话

翻译

避免模型只看到一种数据。


方法3:参数高效微调

例如:

因为:

原模型参数被冻结

遗忘会明显减少。


Error Analysis Flow 总结

graph TD

A[Review Failures]

--> B[Cluster Errors]

B --> C[Develop Hypotheses]

C --> D[Implement Fixes]

D --> E[Run Experiments]

E --> F[Evaluate]

F --> A

一句话总结

训练决定模型参数,评估决定模型方向,而误差分析决定下一步应该修复什么。

优秀的大模型团队通常不会直接增加数据或继续训练,而是先通过 Error Analysis 找到错误模式,再针对性地修改数据、奖励模型或训练策略。